﻿using System;
using System.Data.SqlClient;
using System.Data;
using Model;
using Interfaces;

namespace Controller
{
    internal class DBFacade
    {
        private SqlConnection con;
        private SqlCommand cmd;
        private TurneringsSystem control;

        #region Constructor
        public DBFacade(TurneringsSystem control)
        {

            string connection = "Data Source=linux2.tietgen.dk; Initial Catalog=gruppe102.6; User ID=gruppe102.6; Password=pe9Eh9sE; Connect Timeout=10";
            this.control = control;

            con = new SqlConnection(connection);
            cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandType = CommandType.StoredProcedure;
        }
        #endregion

        #region Methods
        public bool TestForbindelse()
        {
            try
            {
                con.Open();
                con.Close();
            }
            catch
            {
                return false;
            }

            return true;
        }

        public void HentDatabase()
        {
            SqlDataReader dataReader;
            int antalRunder, nr, rating, rundeNr, modstander, farve, placering;
            string turneringsnavn, gruppenavn, deltagernavn, efternavn, klub;
            double korrektion, resultat, ialt;
            DateTime startdato;
            int turneringsID = -1, deltagerID = -1, rundeID = -1;

            cmd.Parameters.Clear();
            cmd.CommandText = "HentTurneringer";

            try
            {
                con.Open();
                dataReader = cmd.ExecuteReader();

                while (dataReader.Read() == true)
                {
                    if (turneringsID != (int)dataReader["turneringsID"])
                    {
                        turneringsID = (int)dataReader["turneringsID"];
                        turneringsnavn = (string)dataReader["turneringsnavn"];
                        gruppenavn = (string)dataReader["gruppenavn"];
                        startdato = (DateTime)dataReader["startdato"];
                        antalRunder = (int)dataReader["antalRunder"];

                        control.TilføjTurnering(turneringsnavn, gruppenavn, startdato, antalRunder, turneringsID);
                    }
                    if (deltagerID != (int)dataReader["deltagerID"])
                    {
                        deltagerID = (int)dataReader["deltagerID"];
                        deltagernavn = (string)dataReader["deltagernavn"];
                        efternavn = (string)dataReader["efternavn"];
                        nr = (int)dataReader["nr"];
                        klub = (string)dataReader["klub"];
                        rating = (int)dataReader["rating"];
                        korrektion = (double)dataReader["korrektion"];

                        control.TilføjDeltager(deltagernavn, efternavn, klub, nr, rating, korrektion, deltagerID);
                    }
                    if (rundeID != (int)dataReader["rundeID"])
                    {
                        rundeID = (int)dataReader["rundeID"];
                        rundeNr = (int)dataReader["rundeNr"];
                        modstander = (int)dataReader["modstander"];
                        farve = (int)dataReader["farve"];
                        resultat = (double)dataReader["resultat"];
                        ialt = (double)dataReader["ialt"];
                        placering = (int)dataReader["placering"];

                        control.TilføjRunde(rundeNr, modstander, farve, resultat, ialt, placering, rundeID);
                    }
                }
                con.Close();
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
            }
        }
        #endregion

        #region Turnering
        public int TilføjTurnering(string navn, string gruppenavn, DateTime startdato, int antalRunder)
        {
            cmd.CommandText = "TilfoejTurnering";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@turneringsnavn", SqlDbType.NVarChar);
            par.Value = navn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@gruppenavn", SqlDbType.NVarChar);
            par.Value = gruppenavn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@startdato", SqlDbType.Date);
            par.Value = startdato;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@antalRunder", SqlDbType.Int);
            par.Value = antalRunder;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@turneringsID", SqlDbType.Int);
            par.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
            catch(SqlException)
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
                return -1;
            }
            return (int)par.Value;
        }

        public bool RedigerTurnering(string navn, string gruppenavn, DateTime startdato, int antalRunder, int turneringsID)
        {
            int rækker;
            cmd.CommandText = "RedigerTurnering";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@turneringsnavn", SqlDbType.NVarChar);
            par.Value = navn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@gruppenavn", SqlDbType.NVarChar);
            par.Value = gruppenavn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@startdato", SqlDbType.Date);
            par.Value = startdato;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@antalRunder", SqlDbType.Int);
            par.Value = antalRunder;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@turneringsID", SqlDbType.Int);
            par.Value = turneringsID;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                rækker = cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
                return false;
            }
            if (rækker == 1)
                return true;
            else
                return false;
        }

        public bool FjernTurnering(int turneringsID)
        {
            int rækker;
            cmd.CommandText = "FjernTurnering";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@turneringsID", SqlDbType.Int);
            par.Value = turneringsID;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                rækker = cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
                return false;
            }
            if (rækker == 1)
                return true;
            else
                return false;
        }
        #endregion

        #region Deltager
        public int TilføjDeltager(string fornavn, string efternavn, string klub, int nr, int rating, double korrektion, int turneringsID)
        {
            cmd.CommandText = "TilfoejDeltager";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@turneringsID", SqlDbType.Int);
            par.Value = turneringsID;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@deltagernavn", SqlDbType.NVarChar);
            par.Value = fornavn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@efternavn", SqlDbType.NVarChar);
            par.Value = efternavn;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@nr", SqlDbType.Int);
            par.Value = nr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@klub", SqlDbType.NVarChar);
            par.Value = klub;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@rating", SqlDbType.Int);
            par.Value = rating;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@korrektion", SqlDbType.Float);
            par.Value = korrektion;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@deltagerID", SqlDbType.Int);
            par.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
                return -1;
            }
            return (int)par.Value;
        }

        public bool FjernDeltager(int deltagerID)
        {
            int rækker;
            cmd.CommandText = "FjernDeltager";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@deltagerID", SqlDbType.Int);
            par.Value = deltagerID;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                rækker = cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
                return false;
            }
            if (rækker > 0)
                return true;
            else
                return false;
        }

        public bool FlytDeltager(int deltagerID, int nyPlacering)
        {
            int rækker;
            cmd.CommandText = "FlytDeltager";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@deltagerID", SqlDbType.Int);
            par.Value = deltagerID;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@nr", SqlDbType.Int);
            par.Value = nyPlacering;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                rækker = cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
                return false;
            }
            if (rækker == 1)
                return true;
            else
                return false;
        }
        #endregion

        #region Runde
        public int TilføjRunde(int deltagerID, int rundeNr, int modstander, int farve, double resultat, double ialt, int placering)
        {
            cmd.CommandText = "TilfoejRunde";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@deltagerID", SqlDbType.Int);
            par.Value = deltagerID;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@rundeNr", SqlDbType.Int);
            par.Value = rundeNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@modstander", SqlDbType.Int);
            par.Value = modstander;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@farve", SqlDbType.Int);
            par.Value = farve;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@resultat", SqlDbType.Float);
            par.Value = resultat;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@ialt", SqlDbType.Float);
            par.Value = ialt;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@placering", SqlDbType.Int);
            par.Value = placering;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@rundeID", SqlDbType.Int);
            par.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
                return -1;
            }
            return (int)par.Value;
        }

        public bool RedigerRunde(int rundeID, int rundeNr, int modstander, int farve, double resultat, double ialt, int placering)
        {
            int rækker;
            cmd.CommandText = "RedigerRunde";
            cmd.Parameters.Clear();

            SqlParameter par = new SqlParameter("@rundeID", SqlDbType.Int);
            par.Value = rundeID;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@rundeNr", SqlDbType.Int);
            par.Value = rundeNr;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@modstander", SqlDbType.Int);
            par.Value = modstander;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@farve", SqlDbType.Int);
            par.Value = farve;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@resultat", SqlDbType.Float);
            par.Value = resultat;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@ialt", SqlDbType.Float);
            par.Value = ialt;
            cmd.Parameters.Add(par);

            par = new SqlParameter("@placering", SqlDbType.Int);
            par.Value = placering;
            cmd.Parameters.Add(par);

            try
            {
                con.Open();
                rækker = cmd.ExecuteNonQuery();
                con.Close();
            }
            catch (SqlException)
            {
                if (con.State == ConnectionState.Open)
                {
                    con.Close();
                }
                return false;
            }
            if (rækker == 1)
                return true;
            else
                return false;
        }
        #endregion
    }
}
